PAT结构体作业

您所在的位置:网站首页 设有以下变量定义 char str PAT结构体作业

PAT结构体作业

2024-06-05 16:49| 来源: 网络整理| 查看: 265

PTA | 程序设计类实验辅助教学平台 (pintia.cn)

(感谢浙大提供学习平台)

目录

判断题

选择题

判断题

1、结构体成员的类型必须是基本数据类型。(错)

解答:结构体(Struct)的成员类型不必只是基本数据类型,它可以包含基本数据类型、其他结构体、指针、数组等各种数据类型。结构体的目的是允许你将不同数据类型的成员组合在一起,以创建一个自定义的复合数据类型。这使得你可以更灵活地表示和组织数据。

例如,你可以创建一个结构体,其中包含整数、浮点数和字符串作为成员:

struct Person {     int age;     float height;     char name[50]; };

在上述示例中,`Person` 结构体包含了不同数据类型的成员,包括 `int`、`float` 和字符数组 `char name[50]`。

因此,结构体的成员类型可以是基本数据类型,也可以是其他结构体,指针,数组等,以满足你在程序中所需的数据组织和表示的要求。

2、结构体类型本身不占用内存空间,结构体变量占用内存空间。(对)

解答:是的,结构体类型本身在内存中不占用空间,它只是一种用户定义的数据类型,用于描述多个不同数据类型的组合。当你创建一个结构体变量时,这个变量会占用内存空间,该空间大小取决于结构体内部成员的数据类型和大小。

例如,在下面的 C 语言代码中,定义了一个 `Person` 结构体类型,但是只有当你创建一个 `struct Person` 类型的变量时,内存才会分配给这个变量:

struct Person {     int age;     float height;     char name[50]; }; int main() {     struct Person person1; // 创建一个 Person 结构体变量     // 现在,person1 变量占用了内存空间,包含了 age、height 和 name 成员     return 0; }

在上述代码中,`struct Person person1;` 创建了一个 `Person` 类型的结构体变量 `person1`,这个变量占用了内存空间,其中包含了 `int` 类型的 `age`、`float` 类型的 `height` 和字符数组 `char name[50]`。

3、指向结构体变量的指针可以作函数参数,实现传址调用。(对)

解答:是的,指向结构体变量的指针可以作为函数参数,实现传址调用(pass by reference)。通过传递结构体变量的指针,你可以在函数内部直接修改结构体的内容,而不是传递结构体的副本。这样可以避免在函数调用时产生额外的内存开销。

下面是一个示例,演示了如何使用指向结构体的指针作为函数参数,实现传址调用:  

#include // 定义一个结构体类型 struct Person {     int age;     float height; }; // 函数,接受指向结构体的指针作为参数 void modifyPerson(struct Person *personPtr) {     // 修改结构体的成员     personPtr->age = 30;     personPtr->height = 5.9; } int main() {     // 创建一个结构体变量     struct Person person1 = {25, 6.0};          // 输出修改前的结构体成员的值     printf("Before modification: Age = %d, Height = %.2f\n", person1.age, person1.height);          // 调用函数,传递结构体变量的地址     modifyPerson(&person1);          // 输出修改后的结构体成员的值     printf("After modification: Age = %d, Height = %.2f\n", person1.age, person1.height);     return 0; }

在上述示例中,`modifyPerson` 函数接受一个指向结构体 `Person` 的指针作为参数,然后修改了结构体的成员。通过传递结构体变量 `person1` 的地址(`&person1`),函数能够直接修改 `person1` 的内容,从而实现了传址调用。

4、假设结构指针p已定义并正确赋值,其指向的结构变量有一个成员是int型的num,则语句 *p.num = 100; 是正确的。(错)

解答:不是正确的。在C语言中,通过指针访问结构体成员需要使用`->`运算符,而不是`.`运算符。所以,如果结构体指针`p`指向的结构体变量有一个成员是int型的`num`,你应该使用`p->num = 100;`来正确赋值。这是因为`p->num`表示"p所指向的结构体变量的num成员"。而`*p.num`会被解释为"p所指向的结构体变量的num成员的值",这是错误的语法。

选择题

1、设有如下定义,则错误的输入语句是( B)。

struct ss{ char name[10]; int age; char sex; } std[3], *p = std;

A.scanf("%d", &(*p).age);

B.scanf("%d", p->&age);

C.scanf("%c", &std[0].sex);

D.scanf("%c", &(p->sex));

解答:

正确答案是 B. scanf("%d", p->&age);**。

在选项 B 中,`p->&age` 的语法是错误的。`p->` 表示取结构体指针 `p` 指向的结构体变量的成员,然后使用 `&` 取 `age` 成员的地址。这种语法是不允许的。

正确的写法应该是使用 `p->age`,表示取结构体指针 `p` 指向的结构体变量的 `age` 成员,然后直接将该成员的地址传递给 `scanf` 函数。所以,正确的语句应该是:

scanf("%d", &(p->age));

其他选项 A、C 和 D 的语法都是正确的。

2、若有以下结构体类型定义,

struct worker {

        char name[16];         struct date{        

                 int year;                  int month;                  int day;         }birthday; }x;

则赋值语句正确的是( )。

A.x.year=1999;

B.x.birthday.month=3;

C.x.name="黎明";

D.x.birthday=1999.9.9;

解答:在给嵌套结构体成员赋值时,应该按照嵌套的结构体层级来访问成员。根据提供的结构体定义:

struct worker {     char name[16];     struct date {         int year;         int month;         int day;     } birthday; } x;

正确的赋值语句是:

B. `x.birthday.month = 3;`

这是因为 `birthday` 是 `worker` 结构体的一个成员,它本身是一个结构体,而 `month` 是 `birthday` 结构体的一个成员。所以,要给 `month` 赋值,应该使用 `x.birthday.month`。

其他选项的问题在于数据类型的匹配或者语法的错误:

A. `x.year=1999;` - 这是错误的,因为`year`是`birthday`结构体的成员,应该通过`x.birthday.year`来赋值。

C. `x.name="黎明";` - 这是错误的,因为字符串的赋值应该使用strcpy函数,而不是直接赋值。

D. `x.birthday=1999.9.9;` - 这是错误的,因为试图将一个日期值直接赋给一个结构体的赋值是不允许的。你需要分别给`x.birthday.year`、`x.birthday.month`和`x.birthday.day`赋值。

3、有以下结构体说明、变量定义和赋值语句:

struct SID

{

        char name [10];

        int age;

        char sex;

}s[5],stu;

则以下 scanf函数调用语句有错误的是( )。

A.scanf("%s", s[0].name);

B.scanf("%d", &s[0].age);

C.scanf("%s", &stu.name);

D.scanf("%d",& stu.sex);

解答:

在考虑 scanf 函数调用时,你需要确保传递的参数类型与 scanf 期望的格式化字符串中的占位符类型相匹配。根据提供的结构体定义:

struct SID {     char name[10];     int age;     char sex; } s[5], stu;

以下 scanf 函数调用是错误的:

D. `scanf("%d", &stu.sex);`

因为 `stu.sex` 是一个 char 类型的变量,所以应该使用 `%c` 作为格式化字符串,而不是 `%d`。正确的 scanf 函数调用应该是:

D. `scanf("%c", &stu.sex);`

在选项 A、B 中,格式化字符串和参数类型是匹配的,所以它们是正确的。

在这个情况下,`stu.name` 是一个字符数组,不需要使用取地址操作符 `&`。所以,正确的写法是:

scanf("%s", stu.name);

对于字符数组,不需要使用 `&` 取地址,因为数组名本身就是数组的地址。所以,选项 C 是错误的。

4、有以下结构体说明、变量定义和赋值语句,则以下scanf函数调用语句有错误的是

struct STD { char name[10]; int age; char sex; } s[5],*ps; ps=&s[0];

A.scanf("%c",&(ps->sex));

B.scanf("%d",ps->age);

C.scanf("%s",s[0].name);

D.scanf("%d",&s[0].age);

解答:在提供的结构体说明、变量定义和赋值语句中:

struct STD {     char name[10];     int age;     char sex; } s[5], *ps; ps = &s[0];

以下 `scanf` 函数调用语句是错误的:

B. `scanf("%d", ps->age);`

这是因为 `age` 是一个 `int` 类型的成员,所以你应该使用 `&` 取地址操作符来传递正确的指针给 `scanf`。正确的写法是:

B. `scanf("%d", &(ps->age));`

其他选项中的 `scanf` 函数调用是正确的:

A. `scanf("%c", &(ps->sex));` - 正确,因为 `sex` 是一个 `char` 类型的成员。

C. `scanf("%s", s[0].name);` - 正确,因为 `name` 是一个字符数组,不需要取地址操作符 `&`。

D. `scanf("%d", &s[0].age);` - 正确,因为 `age` 是一个 `int` 类型的成员。

5、设有如下定义,则对data中的a成员的正确引用是()。

struct sk{ int a; double b; } data, *p = &data;

A.(*p).data.a

B.(*p).a

C.p->data.a

D.p.data.a

解答:正确的引用方式是:

B. `(*p).a`

或者等价的:

C. `p->a`

这是因为 `p` 是一个指向 `struct sk` 结构体的指针,使用 `->` 运算符或者间接引用(解引用)`*` 都可以访问 `p` 指向的结构体的成员。因此,`p->a` 和 `(*p).a` 都是引用 `data` 结构体变量中的 `a` 成员的正确方式。

6、对于以下结构定义,(*p)->str++中的++加在(D)。

struct { int len; char *str } *p;

A.指针str上

B.指针p上

C.str指向的内容上

D.语法错误

解答:指针类型在调用其成员的时候才用-> 而*p已经是正常的结构体类型了,所以用.才对

 7、对于以下结构定义,++p->str中的++加在()。

struct {    int len;    char *str } *p;

A.指针str上

B.指针p上

C.str指向的内容上

D.语法错误

解答:这里的->优先级高于++,所以++p->str 就相等于++(p->str),由于str是指向char类型的指针,所以++加在了指针strs 上。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3